package com.example.springboot.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.example.springboot.entity.Menu;
import com.example.springboot.entity.Role;
import com.example.springboot.entity.RoleMenu;
import com.example.springboot.mapper.RoleMapper;
import com.example.springboot.mapper.RoleMenuMapper;
import com.example.springboot.service.IMenuService;
import com.example.springboot.service.IRoleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Map;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author cpf
 *
 */
@Service
public class RoleServiceImpl implements IRoleService{
    @Resource
    private RoleMapper roleMapper;

    @Resource
    private RoleMenuMapper roleMenuMapper;

    @Resource
    private IMenuService menuService;
    /**
    * 通过ID查询单条数据
    *
    * @param id 主键
    * @return 实例对象
    */
    @Override
    public Role queryById(Integer id){
        return this.roleMapper.queryById(id);
    }

    /**
    * 条件查询
    * @Param param 查询条件
    */
    @Override
    public List<Role>queryAllInfo(Map<String,Object> param){
        return this.roleMapper.queryAllInfo(param);
    }
    /**
    * 新增数据
    *
    * @param role 实例对象
    * @return 实例对象
    */
    @Override
    public int insert(Role role){
        //加入逻辑代码
        return this.roleMapper.insert(role);
    }

    /**
    * 修改数据
    *
    * @param role 实例对象
    * @return 实例对象
    */
    @Override
    public int update(Role role){
        //加入逻辑代码
        return this.roleMapper.update(role);
    }

    /**
    * 通过主键删除数据
    *
    * @param ids 主键list
    * @return 是否成功
    */
    @Override
    public int deleteByIds(List<Integer> ids){
        return this.roleMapper.deleteByIds(ids);
    }

    /**
    *查询结果数
    */
    @Override
    public long count(Map<String,Object> param){
        return this.roleMapper.count(param);
    }

    /**
    * 批量插入
    */
    @Override
    public int insertBatch(List<Role> entities){
        return this.roleMapper.insertBatch(entities);
    }

    @Transactional
    @Override
    public void setRoleMenu(Integer roleId, List<Integer> menuIds) {

        // 先删除当前角色id所有的绑定关系
        roleMenuMapper.deleteByRoleId(roleId);

        // 再把前端传过来的菜单id数组绑定到当前的这个角色id上去
        List<Integer> menuIdsCopy = CollUtil.newArrayList(menuIds);
        for (Integer menuId : menuIds) {
            Menu menu = menuService.queryById(menuId);
            if (menu.getPid() != null && !menuIdsCopy.contains(menu.getPid())) { // 二级菜单 并且传过来的menuId数组里面没有它的父级id
                // 那么我们就得补上这个父级id
                RoleMenu roleMenu = new RoleMenu();
                roleMenu.setRoleId(roleId);
                roleMenu.setMenuId(menu.getPid());
                roleMenuMapper.insert(roleMenu);
                menuIdsCopy.add(menu.getPid());
            }
            RoleMenu roleMenu = new RoleMenu();
            roleMenu.setRoleId(roleId);
            roleMenu.setMenuId(menuId);
            roleMenuMapper.insert(roleMenu);
        }
    }

    @Override
    public List<Integer> getRoleMenu(Integer roleId) {
        return roleMenuMapper.selectByRoleId(roleId);
    }
}
